package com.gxa.ibear.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;


/**
 * @author bill
 * @date 2023/6/15 14:41
 */
public class JwtUtil {

   private static final String SECURITY = "SsM340+";

    //JWT验证过期时间 EXPIRE_TIME(单位:毫秒) , 指定为30分钟

    // 签发方法,生成Jwt
    public static String sign(String phone, Long EXPIRE_TIME) {
// 设置jwt的过期时间
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
//普通管理员和超级管理员验证手机号,采用手机号后六位加密生成私钥
        Algorithm algorithm = Algorithm.HMAC256(SECURITY);
//生成jwt: 带有用指定密钥进行加密, 对主体进行加密并设定过去时间
        String token = JWT.create()
                .withClaim("phone", phone)
                .withExpiresAt(date)
                .sign(algorithm);
        return token;
    }

    public static String sign(String payLoad,String content, Long EXPIRE_TIME) {
// 设置jwt的过期时间
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
//普通管理员和超级管理员验证手机号,采用手机号后六位加密生成私钥

        Algorithm algorithm = Algorithm.HMAC256(SECURITY);
//生成jwt: 带有用指定密钥进行加密, 对主体进行加密并设定过去时间
        String token = JWT.create()
                .withClaim(payLoad, content)
                .withExpiresAt(date)
                .sign(algorithm);
        return token;
    }

    /**
     * 获得token中的信息无需secret解密也可直接获取
     *
     * @return jwt中声明的手机号
     */
    public static String getPhone(String token, String claimName) {
// 从token中解密得到jwt中的载荷信息
// 得到一个可以读取jwt中的信息的调用对象:DecodedJWT
        DecodedJWT jwt = JWT.decode(token);
        String phone = jwt.getClaim(claimName).asString();
        System.out.println("手机号："+phone);

        return phone;
    }
    /**
     * 获得token中的信息无需secret解密也可直接获取
     *
     * @param token
     * @return jwt中声明的过期时间
     */
//    public static String getTime(String token) {
//// 从token中解密得到jwt中的载荷信息
//// 得到一个可以读取jwt中的信息的调用对象:DecodedJWT
//        DecodedJWT jwt = JWT.decode(token);
//        String exp = jwt.getExpiresAt().toString();
//        System.out.println("过期时间："+exp);
//        return exp;
//    }


    /**
     * 校验jwt是否正确
     *
     * @param token 需要校验的jwt字符串
     * @return 返回验证结果
     */
    public static boolean verify(String token, String phone) throws SignatureVerificationException {

        try{
//根据密码生成JWT私钥校验器
// 普通管理员和超级管理员,都采用手机号后六位加密
            Algorithm algorithm = Algorithm.HMAC256(SECURITY);
            //校验环节
            // 生成一个校验器
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("phone", phone)
                    .build();
            //效验JWT: 通过异常来确定是否校验成功
            DecodedJWT decodedJWT = verifier.verify(token);
            // 测试一下jwt验证后生成的状态
            return true;
        }catch (Exception e){
            return false;
        }
    }
}
